package com.alifi.crm.dal;

import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * CRUD dao
 * 
 * <pre>
 * 包括对实体的增、删、改、查、统计数量等基本方法，
 * 能接受的实体必须继承<code>BaseEntity</code>
 * </pre>
 * 
 * @author wb_haichun.panhch
 * 
 * @param <E>
 *            操作的实体类型，必须是<code>BaseEntity</code>子类
 * @param <ID>
 *            实体ID类型，必须是<code>Serializable</code>子类
 */
public interface CRUDDAO<E extends BaseDO> {

	/**
	 * 保存实体
	 * 
	 * <br>
	 * 将返回的主键设置到实体中的id属性
	 * 
	 * @param entity
	 *            被保存的实体,本方法不检查参数有效性
	 */
	void save(E entity);

	/**
	 * 批量保存实体,数组形式
	 * 
	 * @param entities
	 *            被保存的实体,本方法不检查参数有效性
	 */
	void save(E[] entities);

	/**
	 * 批量保存实体，集合形式
	 * 
	 * @param entities
	 *            被保存的实体,本方法不检查参数有效性
	 */
	void save(Collection<E> entities);

	/**
	 * 更新实体
	 * 
	 * @param entity
	 *            被更新的实体,本方法不检查参数有效性
	 */
	void update(E entity);

	/**
	 * 批量更新
	 * 
	 * @param entities
	 *            被更新的实体,本方法不检查参数有效性
	 */
	void update(E[] entities);

	/**
	 * 批量更新
	 * 
	 * @param entities
	 *            被更新的实体,本方法不检查参数有效性
	 */
	void update(Collection<E> entities);

	/**
	 * 删除实体
	 * 
	 * @param entity
	 *            被删除的实体,本方法不检查参数有效性
	 */

	/**
	 * 读取
	 * 
	 * @param id
	 *            被删除的实体ID,本方法不检查参数有效性
	 * @return
	 */
	E get(Long id);

	/**
	 * 根据条件统计数量
	 * 
	 * @param params
	 *            查询条件参数，如果为<code>null</code>则认为条件为空
	 * @return
	 */
	int count(Map<String, Object> params);

	/**
	 * 根据条件分页查找
	 * 
	 * @param params
	 *            查询条件参数，如果为<code>null</code>则认为条件为空
	 * @param start
	 *            开始下标,不检查该参数有效性
	 * @param count
	 *            查询数量,不检查该参数有效性
	 * @return
	 */
	List<E> find(Map<String, Object> params, int start, int count);

}
